⚡️ Speed up method PolymatrixGame.range_of_payoffs by 1,749%
#25
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
📄 1,749% (17.49x) speedup for
PolymatrixGame.range_of_payoffsinquantecon/game_theory/polymatrix_game.py⏱️ Runtime :
3.83 seconds→207 milliseconds(best of5runs)📝 Explanation and details
The optimization replaces the inefficient double-pass approach in
range_of_payoffs()with a single-pass vectorized operation using NumPy.Key changes:
min([np.min(M) for M in ...])andmax([np.max(M) for M in ...]), which iterate through all matrices twice and involve Python's built-inmin/maxfunctions on a list of scalar values.np.concatenate([M.ravel() for M in ...]), then applyingnp.min()andnp.max()directly on the combined array.Why this is faster:
minandmaxfunctions are highly optimized C implementations that operate on contiguous memory, compared to Python's built-in functions working on lists.np.min()once per matrix, while the optimized version calls it once total.Performance characteristics:
The optimization shows dramatic speedup especially for larger games - achieving 651% to 2010% improvements on large-scale test cases with many players/matchups, while maintaining 9-30% improvements on smaller cases. The single-pass approach scales much better as the number of matrices increases.
✅ Correctness verification report:
🌀 Generated Regression Tests and Runtime
To edit these changes
git checkout codeflash/optimize-PolymatrixGame.range_of_payoffs-mgh46ignand push.